/*
 * CasoRepresentacion.java
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 26/04/2010, 08:26:29 AM
 */


package com.ufps.cuatro.modelo.representacion;

import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.modelo.analizador.UtilAnalizador;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.TipoControl;
import com.ufps.cuatro.util.TipoInterfaz;
import com.ufps.cuatro.util.TipoPropiedad;
import com.ufps.cuatro.util.base.ObjectBase;

/**
 * <i><b>CasoRepresentacion:</b></i><p>Representa un Caso de Representacion para un 
 * tipo de dato de un Modelo Analizado(*.jar).</p>
 * 
 * <p>Los Caso Representacion determinan que tipo de representación se
 * asumirá para crear el Componente que identificará al tipo de dato analizado
 * en un area de interfaz gráfica (Componente).
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 26/04/2010
 * @see ObjectBase
 * 
 */
public class CasoRepresentacion extends ObjectBase{
    private static final long serialVersionUID = -5319017118996149496L;

    /**
     * Determina si el caso a representar es un Array
     */
    protected boolean array = false;
    /**
     * Determina si el caso a representar es un Enum
     */
    protected boolean enumeracion = false;
    /**
     * Tipo de CasoRepresentacion de Representación del Tipo de Dato Representado.
     */
    protected TipoCaso eCaso;
    /**
     * Determina el Tipo de Interfaz que se utilizará en la Representación.
     */
    protected TipoInterfaz eInterfaz;
    /**
     * Determina el Tipo de Control que se utilizará en la Representación.
     */
    protected TipoControl eControl;
    /**
     * Determina el Tipo de Propiedad que se utilizará en la Representación.
     */
    protected TipoPropiedad eTipo;        
    /**
     * Contiene el CasoRepresentacion de Representación de un Tipo Generico Interno.
     */
    protected CasoRepresentacionInterno objCasoInterno;
    /**
     * Constantes para el CasoRepresentacion Enum.
     */
    protected Object[] arrayConstantesEnum;
    /**
     * Objeto ClassPath del Tipo Analizado.
     */
    protected transient Class objClass;
    /**
     * String ClassPath del Tipo Analizado.
     */
    protected String strClassPathCaso;
    /**
     * Objeto ClassPath del Tipo Interno Analizado.
     */
    protected transient Class objClassInterna;
    /**
     * String ClassPath del Tipo Interno Analizado.
     */
    protected String strClassPathCasoInterno;
    /**
     * Determina si el Tipo de Dato es una Collección.
     */
    protected boolean collection;

    /**
     * Constructor por defecto
     */
    public CasoRepresentacion() {
    }

    /**
     * @DefinicionMetodo
     * @param objCaso @DefinicionParametro
     */
    public CasoRepresentacion(CasoRepresentacion objCaso){
        if(objCaso != null){
            this.array = objCaso.array;
            this.enumeracion = objCaso.enumeracion;
            this.eCaso = objCaso.eCaso;
            this.eControl = objCaso.eControl;
            this.eInterfaz = objCaso.eInterfaz;                        
            this.collection = objCaso.collection;
            if(objCaso.objCasoInterno != null)
                this.objCasoInterno = objCaso.objCasoInterno;
            if(objCaso.arrayConstantesEnum != null){                
                this.arrayConstantesEnum = objCaso.getArrayConstantesEnum();
            }
        }
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public boolean existeCasoInterno(){
        return this.objCasoInterno != null;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public boolean isArray() {
        return array;
    }

    /**
     * Establece si es un arreglo
     * @param array @DefinicionParametro
     */
    public void setArray(boolean array) {
        this.array = array;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public boolean isEnumeracion() {
        return enumeracion;
    }

    /**
     * Establece si el caso es una Enumeracion
     * @param enumeracion @DefinicionParametro
     */
    public void setEnumeracion(boolean enumeracion) {
        this.enumeracion = enumeracion;
    }

    /**
     * @DefinicionMetodo
     * @return
     */
    public boolean isCollection() {
        return collection;
    }

    /**
     * @DefinicionMetodo
     * @param collection
     */
    public void setCollection(boolean collection) {
        this.collection = collection;
    }    

    /**
     * Devuelve el Tipo de CasoRepresentacion de Representación del Tipo de Dato Representado.
     * @return Tipo de CasoRepresentacion de Representación del Tipo de Dato Representado.
     */
    public TipoCaso geteCaso() {
        return eCaso;
    }

    /**
     *  Establece el Tipo de CasoRepresentacion de Representación del Tipo de Dato Representado.
     * @param eCaso Tipo de CasoRepresentacion de Representación del Tipo de Dato Representado.
     */
    public void seteCaso(TipoCaso eCaso) {
        this.eCaso = eCaso;
    }

    /**
     * Devuelve el tipo de control
     * @return @DefinicionReturn
     */
    public TipoControl geteControl() {
        return eControl;
    }

    /**
     * Establece el tipo de control
     * @param eControl @DefinicionParametro
     */
    public void seteControl(TipoControl eControl) {
        this.eControl = eControl;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public TipoInterfaz geteInterfaz() {
        return eInterfaz;
    }

    /**
     * @DefinicionMetodo
     * @param eInterfaz @DefinicionParametro
     */
    public void seteInterfaz(TipoInterfaz eInterfaz) {
        this.eInterfaz = eInterfaz;
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public TipoPropiedad getEnumPropiedad() {
        return eTipo;
    }

    /**
     * @DefinicionMetodo
     * @param eTipo @DefinicionParametro
     */
    public void seteTipo(TipoPropiedad eTipo) {
        this.eTipo = eTipo;
    }   

    /**
     * Devuelve el @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public CasoRepresentacionInterno getObjCasoInterno() {
        return objCasoInterno;
    }

    /**
     * @DefinicionMetodo
     * @param objCaso @DefinicionParametro
     */
    public void setObjCasoInterno(CasoRepresentacionInterno objCaso) {
        this.objCasoInterno = objCaso;
    }
    
    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public Object[] getArrayConstantesEnum() {
        return arrayConstantesEnum;
    }

    /**
     * @DefinicionMetodo
     * @param arrayConstantesEnum @DefinicionParametro
     */
    public void setArrayConstantesEnum(Object[] arrayConstantesEnum) {
        this.arrayConstantesEnum = arrayConstantesEnum;
    }

    /**
     * Devuelve el Class que representa el Tipo de Dato Analizado. 
     * @return Class que representa el Tipo de Dato Analizado. 
     */
    public Class getObjClass() {
        try{
            if(objClass == null){
                if(UtilAnalizador.estaRegistradaEnElClassPath(strClassPathCaso)){
                    try {
                        return Class.forName(strClassPathCaso);
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(CasoRepresentacion.class.getName()).log(Level.SEVERE, null, ex);
                        return null;
                    }
                }
                else{
                    return null;
                }
            }
            return objClass;
        }catch(java.lang.NullPointerException ex){}
        return null;
    }

    /**
     * @DefinicionMetodo
     * @param objClass @DefinicionParametro
     */
    public void setObjClass(Class objClass) {
        try{
        this.objClass = objClass;
        this.strClassPathCaso = objClass.getCanonicalName();
    }catch(java.lang.NullPointerException ex){}
        
    }

    /**
     * @DefinicionMetodo
     * @return @DefinicionReturn
     */
    public Class getObjClassInterna() {
       try{
        if(objClassInterna == null){
            if(UtilAnalizador.estaRegistradaEnElClassPath(strClassPathCasoInterno)){
                try {
                    return Class.forName(strClassPathCasoInterno);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(CasoRepresentacion.class.getName()).log(Level.SEVERE, null, ex);
                    return null;
                }
            }
            else{
                return null;
            }
        }
        return objClassInterna;
    }catch(java.lang.NullPointerException ex){}
       return null;
    }

    /**
     * @DefinicionMetodo
     * @param objClassInterna @DefinicionParametro
     */
    public void setObjClassInterna(Class objClassInterna) {
        try{
            this.objClassInterna = objClassInterna;
            this.strClassPathCasoInterno = objClassInterna.getCanonicalName();
        }catch(java.lang.NullPointerException ex){}
        
    }

    /**
     * 
     * @return
     */
    public String getStrClassPathCaso() {
        return strClassPathCaso;
    }

    /**
     * 
     * @param strClassPathCaso
     */
    public void setStrClassPathCaso(String strClassPathCaso) {
        this.strClassPathCaso = strClassPathCaso;
    }

    /**
     * 
     * @return
     */
    public String getStrClassPathCasoInterno() {
        return strClassPathCasoInterno;
    }

    /**
     * 
     * @param strClassPathCasoInterno
     */
    public void setStrClassPathCasoInterno(String strClassPathCasoInterno) {
        this.strClassPathCasoInterno = strClassPathCasoInterno;
    }
    
    @Override
    public int compareTo(Object o) {
        try{
            CasoRepresentacion obj = (CasoRepresentacion) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

//    @Override
//    public Object clone() {
//        CasoRepresentacion objClon = null;
//        //Primero se Clona la Referencia Local
//        objClon = (CasoRepresentacion) super.clone();
//        //Ahora se hace la Clonación Profunda
//        if(arrayConstantesEnum != null){
//            ((CasoRepresentacion)objClon).setArrayConstantesEnum((Object[])arrayConstantesEnum.clone());
//        }
//        if(objCasoInterno != null){
//            ((CasoRepresentacion)objClon).setObjCasoInterno((CasoRepresentacionInterno)objCasoInterno.clone());
//        }
//        if(objClass != null){
//            ((CasoRepresentacion)objClon).setObjClass(objClass);
//        }
//        if(objClassInterna != null){
//            ((CasoRepresentacion)objClon).setObjClassInterna(objClassInterna);
//        }
//        if(strClassPathCaso != null){
//            ((CasoRepresentacion)objClon).setStrClassPathCaso(new String(strClassPathCaso.toCharArray()));
//        }
//        if(strClassPathCasoInterno != null){
//            ((CasoRepresentacion)objClon).setStrClassPathCasoInterno(new String(strClassPathCasoInterno.toCharArray()));
//        }
//        return objClon;
//    }
    
    
}
